package org.apache.ibatis.reflection;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;


/**
 * 反射工厂实现
 * 用于创建 Reflector，同时兼有缓存的功能
 *
 * @author liangweijie
 */
public class DefaultReflectorFactory implements ReflectorFactory {
    private boolean classCacheEnabled = true;
    /**
     * ?泛型通配符
     * 如果只指定了<?>，而没有extends，则默认是允许Object及其下的任何Java类了。也就是任意类。
     * 目标类和反射器映射缓存。
     */
    private final ConcurrentMap<Class<?>, Reflector> reflectorMap = new ConcurrentHashMap<Class<?>, Reflector>();

    public DefaultReflectorFactory() {
    }

    @Override
    public boolean isClassCacheEnabled() {
        return classCacheEnabled;
    }

    @Override
    public void setClassCacheEnabled(boolean classCacheEnabled) {
        this.classCacheEnabled = classCacheEnabled;
    }

    @Override
    public Reflector findForClass(Class<?> type) {
        // classCacheEnabled 默认为 true
        if (classCacheEnabled) {
            // synchronized (type) removed see issue #461
            // 从缓存中获取 Reflector 对象
            Reflector cached = reflectorMap.get(type);
            if (cached == null) {
                // 缓存为空，则创建一个新的 Reflector 实例，并放入缓存中
                cached = new Reflector(type);
                // 将 <type, cached> 映射缓存到 map 中，方便下次取用
                reflectorMap.put(type, cached);
            }
            return cached;
        } else {
            // 创建一个新的 Reflector 实例
            return new Reflector(type);
        }
    }

}
